const Koa = require('koa');
const bodyParser = require('koa-bodyparser');
const app = new Koa();
const path = require('path');
const config = require('./config/config');
const logger = require('koa-logger');

// 这个东西是用来从程序入口处开始计算文件路径
// 例如：在home.js 里引用其他路径下的Js的方式是 require('controllers/controllerDemo');
// 当然还可以使用 require.main.require('controllers/controllerDemo');
require('app-module-path').addPath(__dirname);

app.use(logger());

app.use(async (ctx, next)=>{
    console.log(`有一个新的请求过来:${ctx.request.url}`);
    await next();
});

// 使用cookies
// const cookiesHandle = require('./middlewares/cookiesHandle');
// app.use(cookiesHandle());

// 使用session
// const sessionHandler = require('./middlewares/sessionHandle');
// app.use(sessionHandler(app));

// 处理jsonp请求
const jsonp = require('./middlewares/jsonp');
app.use(jsonp());

// 处理上传文件的中间件,当触发的时候，不必再触发下面的中间件,上传文件的api是：api/upload/img 或者api/upload/file
const {uploadFile} = require('middlewares/upload');
app.use(uploadFile());

// 使用bodyParser中间件来解析post请求的数据
app.use(bodyParser());

// 自定义的中间件处理路由相关的内容,加载路由组件是异步执行的，为了更快的启动服务，异步执行无关紧要
const {addController} = require('./middlewares/controller');// 处理controller目录下的路由组件
app.use(addController());       // 加载controllers目录下的controller
app.use(addController('home'));

// 静态资源,访问民国的照片可以是localhost:3000/img/minguo.jpeg
const static = require('koa-static');
app.use(static(path.join(__dirname, "./static")));

app.listen(config.port, ()=>{
    console.log(`开始在${config.port}监听`);
});

// 这是获取项目根路径的方法
// const process = require('process');
// console.log(`当前主文件路径是:${process.cwd()}`);

// 这是扩展String.Prototype 用来在终端显示不同颜色的字符串。可以配置在Utils里，提供一个通用方法
require('colors');
console.log('hello'.rainbow); // 输出一个彩虹色的hello
